Abstract
O
# Seed for random number generation
set.seed(42)
knitr::opts_chunk$set(cache.extra = knitr::rand_seed)
Does variation in financial agencies’ independence affect congressional success in rulemaking?
How does variation in the number of congressional coalitions affect congressional success in financial agency rulemaking?
Does either conformity or deviation from the party of the President affect congressional success?
Do members of Congress increasingly utilize partisan rhetoric over time to influence success within financial agency rulemaking? - Does variation in partisan rhetoric affect congressional success?
#Abstract (125 words) The outcomes to federal rulemaking proposals in response to congressional lobbying is integral towards understanding how government institutions work. However, federal agencies vary in level of independence, as measured by how responsive they are to public demands. Previous studies have shown that federal agency rulemaking, especially within the financial divisions, has become more independent over time, with agencies becoming less responsive to public comments. Using data from prior studies conducted by Dr. Jennifer Selin and Dr. Devin Judge-Lord, I seek to study whether this pattern can be seen within the congressional sphere — i.e. if financial federal agencies are responsive to congressmembers’ demands. I also attempt to see if there may be any change of influence for those within the same or opposing party of the President.
I will gather data from 40 rules issued by financial agencies, including but not limited to the Consumer Financial Protection Bureau, the Treasury Department, and the Office of the Comptroller of the Currency. I focus on public comments issued by members of Congress and focus on whether their demands were ultimately fulfilled in the final rule. The research design additionally combines data from a previous study conducted by Jennifer L. Selin, who determined an estimate of the level of structural independence for several agencies during the Obama administration. My study will also include rules during the subsequent Trump administration, wherein the Senate majority switched to the Republican party. I will compare and contrast rules from both eras to determine if influence from political parties have grown over time, including determining if there is an increased presence of politicians commenting on policies. I will also use textual analysis in addition to the hand coding to see if elected officials use more partisan rhetoric over time. In this study, “partisan rhetoric” refers to an individual making positive assertions about their own party or negative assertions about the opposing party. I will also examine whether the demands of elected officials that are the same party as the President are increasingly met over those of the opposing party.
Does either conformity or deviation from the party of the President affect congressional success?
One measure of agency independence may be examined by studying the effects of congressmember’s party affiliation and whether it conforms with the President’s party affiliation.
We have the following data for 10 congressmembers:
Success: whether agencies fullfilled Congressmembers’ demands, measured between -2 and 2.
Party: “1” for if the party is the same for the congressmember and the President and “0” if the party is different between the congressmember and the President.
Independence: The estimates of agency independence, derived from Selin’s data.
Coalitions : sizes of coalitions that the congressmember is affiliated with.
Table @ref(tab:data-sim) shows ten rows of simulated data.
library(tidyverse)
library(tibble)
library(msm)
library(kableExtra)
congressional_success <- sample(x = c(-2, -1, 0, 1, 2), 1000, prob = c(0.1, 0.3, .1, 0.4, 0.1), replace = T)
d = tibble(rule_id = c(1:1000, rep(1001:1500, 2)),
congress_id = sample(1:2000),
coalitions = c(rep(1, 1000), rep(2, 1000)),
congressional_success = c(congressional_success, sort(congressional_success)),
coalition_size = rtnorm(1000, mean = 5, sd= 10, lower = 1) %>% rep(2) %>% round(),
party_affiliation = sample(x = c(0,1), 2000, replace = T, prob = c(0.7, .3)),
independence = sample(x = c(4.1,1.643,0.174,0.218,2.269), 2000, replace = T),
comments= c(rtnorm(1000, mean = 10000, sd = 100000, lower = 100), rep(1, 1000)) %>%
sample() %>% round() ,
cong_support = c(rtnorm(1000, mean = 1, sd = 5, lower = 0), rep(0, 1000)) %>% sample() %>% round() )
d %>% sample_n(10) %>% dplyr::select(rule_id, congress_id, everything())
## # A tibble: 10 × 9
## rule_id congress_id coalitions congressional_success coalition_size
## <int> <int> <dbl> <dbl> <dbl>
## 1 1317 1583 2 1 14
## 2 305 1406 1 2 34
## 3 988 1113 1 1 2
## 4 678 683 1 1 21
## 5 346 1970 1 1 8
## 6 434 407 1 1 6
## 7 918 332 1 -1 7
## 8 941 642 1 -1 13
## 9 289 1225 1 1 17
## 10 185 265 1 0 12
## # … with 4 more variables: party_affiliation <dbl>, independence <dbl>,
## # comments <dbl>, cong_support <dbl>
H1: Members of Congress of the same party as the President have their demands fullfilled more often than congressmembers that are of a different politcal party. That is, the relationship between congressional success and agency independence differs by party affiliation.
H0: There is no difference in congressional success for members of Congress of the same of differing party of the President. That is, the relationship between congressional and agency independence does not differ by party affiliation.
The dependent variable is congressional success. For congressmember \(i\), let congressional success be \(y_i\) in the model \(y_i = \beta_0 + ... + \epsilon_i\). \(\beta_0\) is the predicted salary, \(\hat{y}\), when all other variables in the model are 0.
Does the model, \(y_i = \beta_0 + \beta_1*party_i + \epsilon_i\), test the relationship of interest?
model <- lm(congressional_success ~ party_affiliation, data = d)
m <- model %>%
tidy(conf.int = TRUE)
m
## # A tibble: 2 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.0860 0.0322 2.67 0.00770 0.0228 0.149
## 2 party_affiliation -0.0104 0.0604 -0.172 0.864 -0.129 0.108
ggplot(m %>% filter(term != "(Intercept)")) +
aes(x = term,
y = estimate,
ymin = conf.low,
ymax = conf.high) +
geom_pointrange() +
geom_hline(yintercept = 0, color = "grey") +
coord_flip() +
labs(x="", y="OLS Estimate")
# scatterplots
ggplot(d) +
aes(x = party_affiliation, y = congressional_success) +
geom_jitter(aes(alpha = coalition_size))
p <- ggplot(d) +
aes(x = party_affiliation, y = congressional_success) +
geom_jitter(aes(alpha = coalition_size))
p
# illustrating with yhat formula; more easily done with augment()
b0 <- m$estimate[1]
b1 <- m$estimate[2]
p +
geom_line(aes(color = "Deviation", # yhat for opposition party
y = b0 + b1*1) ) +
geom_line(aes(color = "Conformity", # yhat for same party
y = b0 + b1*0) ) +
geom_ribbon(aes(ymax = b0 + b1*1,
ymin = b0 + b1*0), alpha = .1, color = NA)
t-test (compare model output to simple t-test of difference in mean congressional success by party).
# tidy model output object
m
## # A tibble: 2 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.0860 0.0322 2.67 0.00770 0.0228 0.149
## 2 party_affiliation -0.0104 0.0604 -0.172 0.864 -0.129 0.108
# t-test
t.test(congressional_success ~ party_affiliation, data = d) %>% tidy()
## # A tibble: 1 × 10
## estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.0104 0.0860 0.0756 0.170 0.865 1018. -0.110 0.130
## # … with 2 more variables: method <chr>, alternative <chr>
ggplot(d, aes(x = congressional_success)) + geom_histogram()+ labs(x = "Congressional Success")
ggplot(d, aes(x = independence)) + geom_histogram()+ labs(x = "Independence")
ggplot(d, aes(x = coalition_size)) + geom_histogram()+ labs(x = "Coalition size")
\(y_i = \beta_0 + \beta_1*party_i + \beta_2*independence_i + \epsilon_i\)
model_1 <- lm(congressional_success ~ independence + party_affiliation, data = d)
augment()
## # A tibble: 0 × 0
summary(model_1)
##
## Call:
## lm(formula = congressional_success ~ independence + party_affiliation,
## data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.1305 -1.0849 0.8695 0.9286 1.9516
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.05437 0.04534 1.199 0.231
## independence 0.01857 0.01876 0.990 0.322
## party_affiliation -0.00919 0.06042 -0.152 0.879
##
## Residual standard error: 1.219 on 1997 degrees of freedom
## Multiple R-squared: 0.0005056, Adjusted R-squared: -0.0004954
## F-statistic: 0.5051 on 2 and 1997 DF, p-value: 0.6035
m1 <- model_1 %>%
tidy(conf.int = TRUE)
m1
## # A tibble: 3 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.0544 0.0453 1.20 0.231 -0.0345 0.143
## 2 independence 0.0186 0.0188 0.990 0.322 -0.0182 0.0554
## 3 party_affiliation -0.00919 0.0604 -0.152 0.879 -0.128 0.109
ggplot(m1 %>% filter(term != "(Intercept)")) +
aes(x = term,
y = estimate,
ymin = conf.low,
ymax = conf.high) +
geom_pointrange() +
geom_hline(yintercept = 0, color = "grey") +
coord_flip() +
labs(x="", y="OLS Estimate")
# illustrating with yhat formula; more easily done with augment()
b0 <- m1$estimate[1]
b1 <- m1$estimate[2]
b2 <- m1$estimate[3]
p +
geom_line(aes(color = "Deviation", # yhat for opposition party
y = b0 + b1*1 + b2*party_affiliation) ) +
geom_line(aes(color = "Conformity", # yhat for same party
y = b0 + b1*0 + b2*party_affiliation) ) +
geom_ribbon(aes(ymax = b0 + b1*1+ b2*party_affiliation,
ymin = b0 + b1*0+ b2*party_affiliation), alpha = .1, color = NA)
Let’s also plot the residuals. Aside from interpretation, we want to know where our model is a better or worse fit with the data, especially if residuals seem to vary systematically over the range of our data.
augment computes tidy residuals, among other cool things.
m1 <- augment(model_1)
p +
geom_line(aes(y = m1$.fitted)) + # with .fitted from augment()
geom_point(aes(y = m1$.fitted), shape = 1, alpha = .2) + # with .fitted from augment()
geom_segment(aes(xend = independence, yend = m1$.fitted ), alpha = .2, size = 2)
glance(model_1)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.000506 -0.000495 1.22 0.505 0.604 2 -3232. 6472. 6495.
## # … with 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
Unsurprisingly this model yields no significant results (Figure @ref(fig:model-success-plot-sim), Table @ref(tab:mediation-sim)). With lobbying success as the dependent variable, the coefficient on the main variable of interest would be interpreted as a \(\beta_{logmasscomments}\) increase in the five-point influence scale of lobbying success for each one-unit increase in the logged number of comments.
#FIXME move this into another script updating the comment data from google sheet, so you don't need to ping google sheets every time you knit
#comments_sheet <- read_sheet("https://docs.google.com/spreadsheets/d/1HBjG32qWVdf9YxfGPEJhNmSw65Z9XzPhHdDbLnc3mYc/edit?usp=sharing")
comments <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1HBjG32qWVdf9YxfGPEJhNmSw65Z9XzPhHdDbLnc3mYc/edit?usp=sharing")
load(here("data/members.Rdata"))
agency_data <- read_excel(here("data/federal_agencies_estimate.xlsx"))
#FIXME
members %<>%
mutate(nominate_pres = case_when(
congress < 111 ~ 0.693, #bush pres score
congress >= 111 & congress <= 115 ~ -0.358, #obama pres score
congress > 115 & congress <117 ~ 0.403, #trump pres score
congress > 117 ~ -0.320)) #biden pres score
# LOOK AT THIS:
members %>%
distinct(congress, nominate_pres) %>%
arrange(congress)
## # A tibble: 12 × 2
## congress nominate_pres
## <int> <dbl>
## 1 105 0.693
## 2 106 0.693
## 3 107 0.693
## 4 108 0.693
## 5 109 0.693
## 6 110 0.693
## 7 111 -0.358
## 8 112 -0.358
## 9 113 -0.358
## 10 114 -0.358
## 11 115 -0.358
## 12 116 0.403
# Make ideological distance from president variable
members %<>% mutate(
nominate_diff = abs(nominate.dim1-nominate_pres))
# subset comments to those from an icpsr-matched member of Congress
comments1 <- comments %>% drop_na(icpsr)
# select variables we want from members
members_selected <- members %>% select(icpsr, chamber, congress, nominate.dim1, nominate_pres, nominate_diff, party_name)
comments1 %<>% left_join(members_selected)
# Create agency variable from id
comments1 %<>% mutate(Agency = str_remove(id, "-.*") )
# Inspect agencies
unique(comments1$Agency)
## [1] "ACF" "AID" "AMS" "APHIS" "BLM" "BOEM" "BSEE" "CCC"
## [9] "CDC" "CEQ" "CFPB" "COE" "CPSC" "DARS" "DEA" "DOE"
## [17] "DOJ" "DOL" "DOS" "DOT" "EBSA" "ED" "EEOC" "EERE"
## [25] "EOIR" "ESA" "ETA" "FAA" "FAR" "FHWA" "FINCEN" "FISCAL"
## [33] "FMCSA" "FNS" NA "FRA" "FSA" "FSIS" "FSOC" "FTA"
## [41] "FTC" "FWS" "GIPSA" "GSA" "HHS" "HRSA" "IRS" "ITA"
## [49] "LMSO" "MARAD" "MMS" "MSHA" "NHTSA" "NIGC" "NIH" "NLRB"
## [57] "NOAA" "NPS" "NRC" "NTIA" "OCC" "OFCCP" "OFPP" "OMB"
## [65] "OPM" "OSHA" "OSM" "OTS" "PHMSA" "PTO" "RBS" "RITA"
## [73] "RUS" "SBA" "SSA" "TREAS" "TSA" "TTB" "USBC" "USC"
## [81] "USCG" "USDA" "USTR" "VA" "WCPO" "WHD"
# Join in agency independence scores
comments1 %<>% left_join(agency_data, by = "Agency", copy = FALSE)
# Subset to agencies for this study
comments2 <- comments1 %>% filter(!is.na(Estimate))
#Change coloumn name "Estimate" to Independence
names(comments2)[names(comments2) == 'Estimate'] <- "Independence"
# inspect agencies
# unique(comments2$Agency)
comments2 %>%
select(congress, bioname, icpsr, party_name, nominate.dim1, nominate_pres, nominate_diff, Agency, Independence)
## # A tibble: 370 × 9
## congress bioname icpsr party_name nominate.dim1 nominate_pres nominate_diff
## <dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl>
## 1 112 MALONEY,… 29379 Democrati… -0.387 -0.358 0.0290
## 2 112 McCASKIL… 40701 Democrati… -0.143 -0.358 0.215
## 3 112 HEINRICH… 20930 Democrati… -0.325 -0.358 0.0330
## 4 113 MENENDEZ… 29373 Democrati… -0.365 -0.358 0.00700
## 5 112 GRAVES, … 20124 Republica… 0.442 -0.358 0.8
## 6 113 STIVERS,… 21163 Republica… 0.299 -0.358 0.657
## 7 113 PERLMUTT… 20705 Democrati… -0.282 -0.358 0.076
## 8 112 HINOJOSA… 29763 Democrati… -0.34 -0.358 0.0180
## 9 113 BOXER, B… 15011 Democrati… -0.45 -0.358 0.092
## 10 113 WARREN, … 41301 Democrati… -0.77 -0.358 0.412
## # … with 360 more rows, and 2 more variables: Agency <chr>, Independence <dbl>
# scatterplots
ggplot(comments2) +
aes(x = nominate_diff, y = success) +
geom_jitter(aes(alpha = congress))
# add color by party_name, and save plot as p for future use
p1 <- ggplot(comments2) +
aes(x = nominate_diff, y = success, color = party_name) +
geom_jitter(aes(alpha = congress), show.legend = FALSE) + scale_color_discrete()
#remove legend title
p <- p1 + labs(color = NULL)
p
ggplot(comments2, aes(x = success)) + geom_histogram()+ labs(x = "Congressional Success")
ggplot(comments2, aes(x = Independence)) + geom_histogram()+ labs(x = "Independence")
ggplot(comments2, aes(x = nominate_diff)) + geom_histogram()+ labs(x = "Distance in Ideological Scores")
\(y_i = \beta_0 + \beta_1*nominate_i + \epsilon_i\)
\(y_i\) is the extent to which a congressmember’s demands are fullfilled by a federal agency, from a range of -2 (agency fulfilled the opposite of their asks) to 2 (agency completely fullfilled their asks) for all three models.
\(\beta_0\) references the level of success a congressmember experiences given that their nominate score is 0 (i.e. have the same nominate score as the President). \(\beta_1\) references the level of success changed given a unit increase in a congressmember’s ideological distance from the President.
H0: \(\beta_1\)=0 Ideological distance of congressmembers from the President is not associated with success in agencies fullfilling their demands.
H1: \(\beta_1\)≠0 Ideological distance of congressmembers from the President is associated with success in agencies fullfilling their demands.
#creating 3 models using model summary
#FIX "Estimate" var not showing up
# models <- list()
# models[['model_nom']] <- lm(success ~ nominate_diff, data = comments2, y= TRUE, x=TRUE)
# models[['model_mul']] <- lm(success ~ nominate_diff + Estimate, data = comments2)
# models[['model_int']] <- lm(success ~ nominate_diff*Estimate, data = comments2)
#
# msummary(models)
#model 1 summary using msummary()
model_nom <- lm(success ~ nominate_diff, data = comments2, y= TRUE, x=TRUE)
augment()
## # A tibble: 0 × 0
msummary(model_nom)
| Model 1 | |
|---|---|
| (Intercept) | 0.162 |
| (0.380) | |
| nominate_diff | −0.300 |
| (0.621) | |
| Num.Obs. | 52 |
| R2 | 0.005 |
| R2 Adj. | −0.015 |
| AIC | 208.8 |
| BIC | 214.6 |
| Log.Lik. | −101.377 |
| F | 0.234 |
m_nom <- msummary(model_nom, statistic = c("p-value= {p.value}", "confidence-int" = {"conf.int"}), conf_level = .95)
m_nom
| Model 1 | |
|---|---|
| (Intercept) | 0.162 |
| p-value= 0.673 | |
| [−0.601, 0.924] | |
| nominate_diff | −0.300 |
| p-value= 0.631 | |
| [−1.548, 0.947] | |
| Num.Obs. | 52 |
| R2 | 0.005 |
| R2 Adj. | −0.015 |
| AIC | 208.8 |
| BIC | 214.6 |
| Log.Lik. | −101.377 |
| F | 0.234 |
msummary(model_nom)
| Model 1 | |
|---|---|
| (Intercept) | 0.162 |
| (0.380) | |
| nominate_diff | −0.300 |
| (0.621) | |
| Num.Obs. | 52 |
| R2 | 0.005 |
| R2 Adj. | −0.015 |
| AIC | 208.8 |
| BIC | 214.6 |
| Log.Lik. | −101.377 |
| F | 0.234 |
#table summary using tidy
tidy_m_nom <- model_nom %>%
tidy(conf.int = TRUE)
tidy_m_nom
## # A tibble: 2 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.162 0.380 0.425 0.673 -0.601 0.924
## 2 nominate_diff -0.300 0.621 -0.484 0.631 -1.55 0.947
\(\beta_1\) is 0.300, suggesting that congressional success decreases by 0.3 points as ideological distance between legislators and their President increases by 1 point.
#created graph using tidy not msummary()
ggplot(tidy_m_nom %>% filter(term != "(Intercept)")) +
aes(x = term,
y = estimate,
ymin = conf.low,
ymax = conf.high) +
geom_pointrange() +
geom_hline(yintercept = 0, color = "grey") +
coord_flip() +
labs(x="", y="OLS Estimate")
b0 <- tidy_m_nom$estimate[1]
b1 <- tidy_m_nom$estimate[2]
augment_m_nom <- augment(model_nom)
augment_m_nom
## # A tibble: 52 × 9
## .rownames success nominate_diff .fitted .resid .hat .sigma .cooksd
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 9 2 0.092 0.134 1.87 0.0379 1.73 0.0237
## 2 12 -2 0.17 0.110 -2.11 0.0311 1.72 0.0245
## 3 13 -2 0.302 0.0708 -2.07 0.0230 1.73 0.0172
## 4 14 -2 0.869 -0.0996 -1.90 0.0393 1.73 0.0256
## 5 15 2 1.03 -0.148 2.15 0.0590 1.72 0.0511
## 6 16 -2 0.76 -0.0668 -1.93 0.0298 1.73 0.0197
## 7 17 2 0.76 -0.0668 2.07 0.0298 1.73 0.0225
## 8 18 2 0.057 0.144 1.86 0.0415 1.73 0.0259
## 9 19 2 0.657 -0.0359 2.04 0.0235 1.73 0.0170
## 10 44 -1 0.087 0.135 -1.14 0.0384 1.74 0.00891
## # … with 42 more rows, and 1 more variable: .std.resid <dbl>
#graph separated by party
p +
geom_line(aes(color = NULL,
y = b0 + b1*nominate_diff)) +
geom_ribbon(aes(ymax = b0 + b1*nominate_diff + 1.96*0.656,
ymin = b0 + b1*nominate_diff - 1.96*0.656), alpha = .1, color = NA) +
labs(y = "Congressional Success", x = "Congressmember's Ideological Distance from President")
#are comments from the obama administration? how many trump?
#facet by president
#t-test
model_nom
##
## Call:
## lm(formula = success ~ nominate_diff, data = comments2, x = TRUE,
## y = TRUE)
##
## Coefficients:
## (Intercept) nominate_diff
## 0.1615 -0.3004
t.test(comments2$success, comments2$nominate_diff, data = comments2) %>% tidy()
## # A tibble: 1 × 10
## estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 -0.463 0.0192 0.482 -1.93 0.0585 51.7 -0.944 0.0173
## # … with 2 more variables: method <chr>, alternative <chr>
augment_m_nom %>%
ggplot() +
aes(x = nominate_diff, y = success) +
geom_line(aes(y = augment_m_nom$.fitted)) + # with .fitted from augment()
geom_point(aes(y = augment_m_nom$.fitted), shape = 1, alpha = 1) + # with .fitted from augment()
geom_segment(aes(xend = nominate_diff, yend = augment_m_nom$.fitted), alpha = 1, size = 2) +
labs(y = "Congressional Success", x = "Congressmember's Ideological Distance from President")
#adding residuals color
#plotting residuals using check_model()
check_model(model_nom)
Given the p-value of the t-test is 0.947 which is greater than 0.05, we fail to reject the null hypothesis and fail to conclude there is a statistically significant relationship between congressional success and a congressmember’s ideological distance from the President.
\(y_i = \beta_0 + \beta_1*nominate_i + \beta_2*independence_i + \epsilon_i\)
H0: \(\beta_1\)=0 and \(\beta_2\)=0
Ideological distance of congressmembers from the President is not associated with success in agencies fullfilling their demands.
H1: \(\beta_1\)≠0 or \(\beta_2\)≠0
A congressmembers’ nominate score and/or a federal agency levels of independence have an affect on the level of success in fullfilling a congressmembers’ demands.
#creating table with msummary()
model_mul <- lm(success ~ nominate_diff + Independence, data = comments2)
model_mul
##
## Call:
## lm(formula = success ~ nominate_diff + Independence, data = comments2)
##
## Coefficients:
## (Intercept) nominate_diff Independence
## -0.01203 -0.32068 0.09221
m_mul <- msummary(model_mul, statistic = c("p-value= {p.value}", "confidence-int" = {"conf.int"}), conf_level = .95)
m_mul
| Model 1 | |
|---|---|
| (Intercept) | −0.012 |
| p-value= 0.979 | |
| [−0.910, 0.886] | |
| nominate_diff | −0.321 |
| p-value= 0.610 | |
| [−1.575, 0.934] | |
| Independence | 0.092 |
| p-value= 0.459 | |
| [−0.156, 0.340] | |
| Num.Obs. | 52 |
| R2 | 0.016 |
| R2 Adj. | −0.024 |
| AIC | 210.2 |
| BIC | 218.0 |
| Log.Lik. | −101.083 |
| F | 0.395 |
#creating table using tidy
tidy_m_mul <- model_mul %>%
tidy(conf.int = TRUE)
#cov(comments2$Estimate,comments2$nominate_diff)
For every 1 point increase in ideological distance of congressmembers, congressional success decreases by 0.321 points in federal rulemaking. The p-value is 0.610, since this is greater than 0.05, we fail to reject the null hypothesis that nominate scores or levels of agency independence do not affect congressional success.
For every 1 point increase in independence estimates of federal financial agencies, congressional success increases by 0.092 points in federal rulemaking. The p-value is 0.459, since this is greater than 0.05, we fail to reject the null hypothesis that nominate scores or levels of agency independence do not affect congressional success.
#needed tidy table for ggplot
ggplot(tidy_m_mul %>% filter(term != "(Intercept)")) +
aes(x = term,
y = estimate,
ymin = conf.low,
ymax = conf.high) +
geom_pointrange() +
geom_hline(yintercept = 0, color = "grey") +
coord_flip() +
labs(x="", y="OLS Estimate")
b0 <- tidy_m_mul$estimate[1]
b1 <- tidy_m_mul$estimate[2]
b2 <- tidy_m_mul$estimate[3]
#results by party name
# p +
# geom_line(aes(color = NULL,
# y = b0 + b1*nominate_diff + b2*Estimate) ) +
# geom_ribbon(aes(ymax = b0 + b1*nominate_diff+ b2*4.1 + 1.96*0.656,
# ymin = b0 + b1*nominate_diff+ b2*0.174 - 1.96*0.656), alpha = .1, color = NA) +
# labs(y = "Congressional Success", x = "Congressmember's Ideological Distance from President")
#
# add color by agency
p2 <- ggplot(comments2) +
aes(x = nominate_diff, y = success, color = Agency) +
geom_jitter(aes(alpha = congress), show.legend = FALSE) + scale_color_discrete()
#remove legend title
p4 <- p2 + labs(color = NULL)
#results by agency
p4 +
geom_line(aes(color = "CFPB",
y = b0 + b1*nominate_diff + b2*4.1) ) +
geom_line(aes(color = "OCC",
y = b0 + b1*nominate_diff + b2*1.643) ) +
geom_line(aes(color = "IRS",
y = b0 + b1*nominate_diff + b2*0.174) ) +
geom_line(aes(color = "FTC",
y = b0 + b1*nominate_diff + b2*2.269) ) +
geom_ribbon(aes(ymax = b0 + b1*nominate_diff+ b2*4.1 + 1.96*0.656,
ymin = b0 + b1*nominate_diff+ b2*0.174 - 1.96*0.656), alpha = .1, color = NA) +
labs(y = "Congressional Success", x = "Congressmember's Ideological Distance from President")
#creating fit graph
aug_mod_mul <- augment(model_mul)
aug_mod_mul
## # A tibble: 52 × 10
## .rownames success nominate_diff Independence .fitted .resid .hat .sigma
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 9 2 0.092 4.1 0.337 1.66 0.0622 1.74
## 2 12 -2 0.17 4.1 0.312 -2.31 0.0550 1.73
## 3 13 -2 0.302 4.1 0.269 -2.27 0.0463 1.73
## 4 14 -2 0.869 4.1 0.0874 -2.09 0.0600 1.73
## 5 15 2 1.03 4.1 0.0357 1.96 0.0789 1.73
## 6 16 -2 0.76 4.1 0.122 -2.12 0.0509 1.73
## 7 17 2 0.76 4.1 0.122 1.88 0.0509 1.74
## 8 18 2 0.057 4.1 0.348 1.65 0.0660 1.74
## 9 19 2 0.657 4.1 0.155 1.84 0.0452 1.74
## 10 44 -1 0.087 4.1 0.338 -1.34 0.0627 1.75
## # … with 42 more rows, and 2 more variables: .cooksd <dbl>, .std.resid <dbl>
aug_mod_mul %>%
ggplot() +
aes(x = nominate_diff, y = success) +
geom_line(aes(y = aug_mod_mul$.fitted)) + # with .fitted from augment()
geom_point(aes(y = aug_mod_mul$.fitted), shape = 1, alpha = 1) + # with .fitted from augment()
geom_segment(aes(xend = nominate_diff, yend = aug_mod_mul$.fitted), alpha = 1, size = 2) +
labs(y = "Congressional Success", x = "Congressmember's Ideological Distance from President")
#plotting residuals with color = Agency
aug_mod_mul %>%
ggplot() +
aes(y = .resid, x = nominate_diff) +
geom_point(aes(color = "Agency")) +
scale_color_discrete() +
## to show how risiduals are the distance between an
## observation and the regression line:
geom_hline(yintercept = 0, color = "dark grey") +
geom_text(x= mean(aug_mod_mul$nominate_diff), y = 0,
label = "Regression line") +
geom_col(aes(fill = "Agency"), alpha = 1, position ="identity") +
## + labels:
labs(title = "Residuals (Observed - Predicted Success)",
y = "Residuals", x = "Ideological Distance from President")
#plotting residuals using check_model()
check_model(model_mul)
\(y_i = \beta_0 + \beta_1*nominate_i + \beta_2*independence_i + \beta_3*nominate_iXindependence_i + \epsilon_i\)
H0: \(\beta_1\)=0 and \(\beta_2\)=0 and \(\beta_3\)=0 A congressmembers’ nominate score and a federal agency levels of independence have no affect on the level of success in fullfilling a congressmembers’ demands.
H1: \(\beta_1\)≠0 or \(\beta_2\)≠0 or \(\beta_3\)≠0 A congressmembers’ nominate score and/or a federal agency levels of independence have an affect on the level of success in fullfilling a congressmembers’ demands.
model_int <- lm(success ~ nominate_diff*Independence, data = comments2)
#table with msummary()
m_int <- msummary(model_int, statistic = c("p-value= {p.value}", "confidence-int" = {"conf.int"}), conf_level = .95)
m_int
| Model 1 | |
|---|---|
| (Intercept) | 0.630 |
| p-value= 0.225 | |
| [−0.400, 1.660] | |
| nominate_diff | −1.718 |
| p-value= 0.050 | |
| [−3.437, 0.002] | |
| Independence | −0.241 |
| p-value= 0.206 | |
| [−0.618, 0.137] | |
| nominate_diff × Independence | 0.700 |
| p-value= 0.027 | |
| [0.085, 1.315] | |
| Num.Obs. | 52 |
| R2 | 0.113 |
| R2 Adj. | 0.057 |
| AIC | 206.8 |
| BIC | 216.5 |
| Log.Lik. | −98.393 |
| F | 2.030 |
#table with tidy
tidy_m_int <- model_int %>%
tidy(conf.int = TRUE)
Holding federal independence estimates at 0 points, for every 1 unit increase in nominate scores of congressmembers, congressional success decreases by 0.0525 points in federal rulemaking. The p-value is 0.933, since this is greater than 0.05, we fail to reject the null hypothesis that nominate scores or levels of agency independence do not affect congressional success. Also, for every 1 unit increase in nominate scores, success changes by 0.630 + 0.700 ⋅ Estimate. Thus, agencies with the highest estimate (the FTC with an independence score of 4.1), the impact of a one unit increase in the ideological distance between a legislator and the President on congressional success is 0.630 + 0.700(4.1) = 3.5.
For agencies with low independence scores (i.e. the IRS with 0.174), the impact of a one unit increase in the ideological distance between a legislator and the President on congressional success is 0.630 + 0.700(0.174) = 0.7518. Thus, agencies with higher independence scores are less responsive to differences in ideology impacting congressional success. Since the p-value is 0.027<0.05, we reject the null that success does not change due to nominate scores, dependent on independence estimates.
At low levels of agency independence, more ideologically distant legislators are less successful. But at more independent agencies, there is no difference in success for legislators who are closer or more distant from the president.
ggplot(tidy_m_int %>% filter(term != "(Intercept)")) +
aes(x = term,
y = estimate,
ymin = conf.low,
ymax = conf.high) +
geom_pointrange() +
geom_hline(yintercept = 0, color = "grey") +
coord_flip() +
labs(x="", y="OLS Estimate")
marginal_effects <- margins(model_int)
summary(marginal_effects)
## factor AME SE z p lower upper
## Independence 0.0905 0.1185 0.7634 0.4452 -0.1418 0.3227
## nominate_diff -0.3276 0.5990 -0.5470 0.5844 -1.5017 0.8464
#graphing marginal effects
me <- as_tibble(summary(marginal_effects))
ggplot(me) +
aes(x = factor,
y = AME,
ymin = lower,
ymax = upper)+
geom_pointrange() +
geom_hline(yintercept = 0, color = "gray80") +
coord_flip() +
labs(x = NULL, y = "Average Marginal Effect")
#creating cplot
cplot_points <- cplot(model_int, x = "Independence", draw = F)
#cplot by Agency
cplot_points1 <- cplot(model_int, x = "nominate_diff", draw = F)
#plotting cplot
ggplot(data = cplot_points) +
aes(x = reorder(xvals, yvals),
y = yvals,
ymin = lower,
ymax = upper) +
geom_pointrange() +
coord_flip() +
labs(x = NULL, y = "Predicted Success")
#plotting cplot by agency
ggplot(data = cplot_points1) +
aes(x = reorder(xvals, yvals),
y = yvals,
ymin = lower,
ymax = upper) +
geom_pointrange() +
coord_flip() +
labs(x = "Ideological Distance from President", y = "Predicted Success")
For a legislators who are average on all characteristics, the marginal change of a 1-point increase in ideological distance from the President is a 0.327 decrease in congressional success, holding independence constant. This was not statistically significant with a p-value of 0.5844.
For every one unit increase in independence scores for agencies, congressional success increased by 0.0905, holding ideological distance constant.This was not statistically significant with a p-value of 0.4452.
b0 <- tidy_m_int$estimate[1]
b1 <- tidy_m_int$estimate[2]
b2 <- tidy_m_int$estimate[3]
#results by party name
# p +
# geom_line(aes(color = NULL,
# y = b0 + b1*nominate_diff + b2*Independence) ) +
# geom_ribbon(aes(ymax = b0 + b1*nominate_diff+ b2*4.1 + 1.96*0.656,
# ymin = b0 + b1*nominate_diff+ b2*0.174 - 1.96*0.656), alpha = .1, color = NA) +
# labs(y = "Congressional Success", x = "Congressmember's Ideological Distance from President")
#
# add color by agency
p2 <- ggplot(comments2) +
aes(x = nominate_diff, y = success, color = Agency) +
geom_jitter(aes(alpha = congress), show.legend = FALSE) + scale_color_discrete()
#remove legend title
p4 <- p2 + labs(color = NULL)
#results by agency
p4 +
geom_line(aes(color = "CFPB",
y = b0 + b1*nominate_diff + b2*4.1) ) +
geom_line(aes(color = "OCC",
y = b0 + b1*nominate_diff + b2*1.643) ) +
geom_line(aes(color = "IRS",
y = b0 + b1*nominate_diff + b2*0.174) ) +
geom_line(aes(color = "FTC",
y = b0 + b1*nominate_diff + b2*2.269) ) +
geom_ribbon(aes(ymax = b0 + b1*nominate_diff+ b2*4.1 + 1.96*0.656,
ymin = b0 + b1*nominate_diff+ b2*0.174 - 1.96*0.656), alpha = .1, color = NA) +
labs(y = "Congressional Success", x = "Congressmember's Ideological Distance from President")
#creating fit graph
aug_mod_int <- augment(model_int)
aug_mod_int
## # A tibble: 52 × 10
## .rownames success nominate_diff Independence .fitted .resid .hat .sigma
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 9 2 0.092 4.1 -0.252 2.25 0.0859 1.65
## 2 12 -2 0.17 4.1 -0.162 -1.84 0.0703 1.67
## 3 13 -2 0.302 4.1 -0.0102 -1.99 0.0516 1.66
## 4 14 -2 0.869 4.1 0.643 -2.64 0.0811 1.64
## 5 15 2 1.03 4.1 0.828 1.17 0.122 1.68
## 6 16 -2 0.76 4.1 0.517 -2.52 0.0616 1.65
## 7 17 2 0.76 4.1 0.517 1.48 0.0616 1.67
## 8 18 2 0.057 4.1 -0.292 2.29 0.0940 1.65
## 9 19 2 0.657 4.1 0.399 1.60 0.0492 1.67
## 10 44 -1 0.087 4.1 -0.258 -0.742 0.0870 1.68
## # … with 42 more rows, and 2 more variables: .cooksd <dbl>, .std.resid <dbl>
aug_mod_int %>%
ggplot() +
aes(x = nominate_diff, y = success) +
geom_line(aes(y = aug_mod_int$.fitted)) + # with .fitted from augment()
geom_point(aes(y = aug_mod_int$.fitted), shape = 1, alpha = 1) + # with .fitted from augment()
geom_segment(aes(xend = nominate_diff, yend = aug_mod_int$.fitted), alpha = 1, size = 2) +
labs(y = "Congressional Success", x = "Congressmember's Ideological Distance from President")
#adding residuals color
#plotting residuals using check_model()
check_model(model_int)
glance(model_int)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.113 0.0571 1.67 2.03 0.122 3 -98.4 207. 217.
## # … with 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
glance(model_mul)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.0159 -0.0243 1.74 0.395 0.676 2 -101. 210. 218.
## # … with 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
Wendy E. Wagner describes a salient issue within the rulemaking process, wherein well-funded interest groups attempt to overwhelm the decision making process in a regulatory context. She states “information capture refers to the excessive use of information and related information costs as a means of gaining control over regulatory decision-making in informal rulemakings.” In her study, she describes excessive use of telephone calls, emails, memorandas, and petitions of appeal to bombard overstretched agency staff, and therefore forces them to disregard their own expert opinions on the rule, as well as an inability to properly process other sides of the issue. As congresspeople are often considered to be a part of well-funded interest groups, especially taking into consideration that many congresspeople jointly write letters to petition for or against an issue. As such, this may skew the overall success of the Congressmembers’ demands. Even if congressmembers do not employ information capture to influence the success of their demands, they may be associated with the interest groups that do. It is important to create this distinction as the results are dependant on how rulemaking agencies consider congressmembers’ asks and their own levels of federal independence, rather than the tactics used by an interest group.
A federal agencies levels of independence does not end up being the biggest influence on whether a demand is fulfilled, rather its a failure for interest groups to self-process information they give agencies, i.e. filter failure. Even agencies with a high level of independence and have a commited to openness and transperency will not be able to avoid the issue of information capture. Regulatory solutions to a diverse amount of interest groups is no longer possible, given that much of the information is buried within mountains of information. Wagner continues, “once excessive information begins to gum up the works, simple fixes are no longer possible. Radical institutional overhaul becomes the only viable remedy.” The idea of information theory underscores the idea of ensuring communications to large governing bodies such as regulatory agencies is efficient and effective encapsulates the issue for all interested parties on a given rule.
The financial rulemaking process is often opaque and difficult to understand, which exacerbates the issue. Well-funded groups, paired with congressional pressure, imploy extremely technical language as well overly detailed arguments for unrelated aspects of the rule, therefore gumming up the rulemaking process. Wagner claims “To preserve issues for litigation, affected parties are thus best-advised to provide comments2 that are specific, detailed, and well documented. This seemingly reasonable requirement for specificity again encourages interested parties to provide too much documentation, too many specifics, and too much detail, rather than too little.” Given there are increasing information costs for overly technical comments, this becomes the basis of well-funded interest groups’ comment issuing process. Further, increasing amounts of direct partipation with the federal agencies may cause the federal agencies to increasingly rely on the experts within the interest groups, rather than retaining their own experts and objective opinions.
Wagner provides several means of avoiding the information capture process, including an increase the civic participation of the agency staff, as effective agency leadership and an awareness of the information capture process is powerful towards maintaining objectivity. However, she postulates that it is not enough, as agency staff “will face an uphill legal battle to surmount all of the one-sided pressures.” Moreover, hiring of agency staff must be transparent and enable only those without a strong favoring for a certain interest group, which is a difficult and nebulous statement. Wagner also suggests providing the public with “a number of legislative and executive innovations, such as cost-benefit analysis” in order to allow the information to be more digestible for a layperson as well as an opportunity to focus on different implications of the rule.
Interestingly, Wagner also provides a mechnaism that allows congressmembers’ to alleviate, rather than contribute, to the issue. While civic-minded agency staff is poweful, civic-minded beaurocrats within Congress and the White House is more powerful. Drafting regulations to limit the level of information distributed may be effective in preventing the information capture process. However, it is then imperative for congressmembers’ to maintain objectivity within the rulemkaing process, as it stands this is not the case as congressmembers’ often issue public comments with their own opinions on the matter. This would require a complete overhaul of the rulemaking process as it stands, as well as additional judicial reviews and oversight boards to maintain politicians’ objectivity.
Considering Wagner’s assertions of well-funded interest groups having an affect on the outcomes of policies, and the underlying assumptions of legislators being associated with highly funded groups, Berry et. al. bring up another factor that may influence levels of agency success within the congressional sphere in their study “The President and the Distribution of Federal Spending.” They study how majority party status affects the distribution of federal funds within a single party domain within a short period of time. They arrive to the conclusion “that presidents systematically influence the geographic distribution of federal spending, and that this influence inheres in both the writing and implementation stages of the appropriations process.” Their results confirmed their hypothesis, where a 4% increase in a district or county’s budget when their representative was from the same party as the president, or an approxiamtely $23 million dollar increase in their budget. This supports my hypothesis that those ideologically similar to the president would experience higher levels of influence within a regulatory context. Aditionally, it supports the assertion that the President does exert an influence for any given party, perhps through vote-buying.